package com.zyx.mapstruct.covert;

import com.zyx.mapstruct.covert.basic.BasicConvertObject;
import com.zyx.mapstruct.domain.UserVO1;
import com.zyx.mapstruct.domain.UserVO2;
import com.zyx.mapstruct.entity.User;
import com.zyx.mapstruct.util.DateTransform;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

/**
 * @author Yaxi.Zhang
 * @since 2022/10/11 14:47
 */
// @Mapper(componentModel = "spring")
// 定义属性类型不同时，转换时可能会使用到的类
@Mapper(componentModel = "spring", uses = DateTransform.class)
public interface UserCovertExtends extends BasicConvertObject<UserVO1, UserVO2> {
    UserCovertExtends INSTANCE = Mappers.getMapper(UserCovertExtends.class);

    /**
     * 字段数量类型数量相同，利用工具BeanUtils也可以实现类似效果
     */
    // UserVO1 toConvertVO(User source);
    // User fromConvertEntity(UserVO1 userVO1);

    /**
     * 字段数量类型相同,数量少：仅能让多的转换成少的
     */
    UserVO2 toConvertVO(User source);
    /**
     * 字段类型不一致:
     * 以下的类型之间是mapstruct自动进行类型转换的:
     *           1、基本类型及其他们对应的包装类型。
     *              此时mapstruct会自动进行拆装箱。不需要人为的处理
     *           2、基本类型的包装类型和string类型之间
     */
    // @Mappings({
    //         @Mapping(target = "createTime", expression = "java(com.java.mmzsblog.util.DateTransform.strToDate(source.getCreateTime()))"),
    // })
    // UserVO3 toConvertVO(User source);
    //
    // User fromConvertEntity(UserVO3 userVO3);
    /**
     * 字段类型一致，名字不一致
     * @param source
     * @return
     */
    // @Mappings({
    //         @Mapping(source = "id", target = "userId"),
    //         @Mapping(source = "name", target = "userName")
    // })
    // UserVO4 toConvertVO(User source);
    // User fromConvertEntity(UserVO4 userVO4);
}
